-- PhoneNumberRecordM
-- Create by huanghr
-- 手机和身份证记录模块

module("PhoneNumberRecordM", package.seeall);

-- 身份证记录功能是否开启
local idcard_is_open = 0;

-- 手机号开关
local phone_is_open = 0;

-- 验证码长度
local AUTHCODE_LEN     = 6;

-- 手机号长度
local PHONE_NUMBER_LEN = 11;

-- 身份证长度
local ID_CARD_LEN      = 18;

-- 有效时间5分钟
local VALID_TIME = 5 * 60;

-- 提示信息
local VERIFY_RET_GS      = 1;   -- 本地GS验证返回消息
local VERIFY_RET_LEITING = 2;   -- 雷霆发送短信返回提示

-- 记录操作类型
OPERATE_RECORD_LT_PHONE_NUMBER  = 1;   -- 雷霆平台直接发送的手机号，记录时不需要验证码
OPERATE_RECORD_PHONE_NUMBER     = 2;   -- 正常流程需要验证码验证
OPERATE_RECORD_ID_CARD          = 3;   -- 记录身份证号

-- 检查验证码超时
function checkTimeout()
    -- 检查验证码是否超时
    local authInfo = ME.user.dbase:queryTemp("auth_code_info") or {};

    local beginTime = authInfo["auth_time"];

    -- 没有发送时间
    if beginTime == nil then
        return false;
    end

    -- 有效时间内
    if TimeM.getCurrentTime() - beginTime < VALID_TIME then
        return false;
    end

    return true;
end

-- 手机验证码是6位数字
function checkAuthCode(authCode)
    -- 过滤下空格
    local numStr = string.trim(authCode);

    -- 验证规则(长度为6，所有的的都是数字)
    if string.len(numStr) ~= AUTHCODE_LEN then
        return false;
    end

    local beginIndex, endIndex = string.find(numStr, "%d+");

    -- 第1位到第6都是数字
    if not (beginIndex == 1 and endIndex == AUTHCODE_LEN) then
        return false;
    end

    -- 检查下是否相等
    local authInfo = ME.user.dbase:queryTemp("auth_code_info") or {};

    local curAuthCode = authInfo["auth_code"];

    if curAuthCode ~= authCode then
        return false;
    end

    if checkTimeout() then
        return false;
    end

    return true;
end

-- 手机号码验证规则
function checkPhoneNumIsOk(phoneStr)
    -- 过滤下空格
    local numStr = string.trim(phoneStr);

    -- 验证规则(长度为11，所有的的都是数字，第一位是1，第二位是[3,4,5,7,8]中其中一个)
    if string.len(numStr) ~= PHONE_NUMBER_LEN then
        return false;
    end

    local beginIndex, endIndex = string.find(numStr, "%d+");

    -- 第1位到第11都是数字
    if not (beginIndex == 1 and endIndex == PHONE_NUMBER_LEN) then
        return false;
    end

    -- 第一位是1
    local firstChar = string.sub(numStr, 1, 1);
    if firstChar ~= "1" then
        return false;
    end

    local secondChar = tonumber(string.sub(numStr, 2, 2));

    local numTable = {3, 4, 5, 7, 8};

    -- 第二位是否符合（根据当前运营商号码段）
    if table.indexOf(numTable, secondChar) <= 0 then
        return false;
    end

    return true;
end

-- 记录结果
function recordResult(recordType, result)
    -- 成功了,客户端自己记录下，记录结果
    if result == PHONE_NUMBER_RECORD_OK then
        if recordType == OPERATE_RECORD_LT_PHONE_NUMBER or recordType == OPERATE_RECORD_PHONE_NUMBER then

            BuffDataM.set("phone_number_record", 1, 1);

        elseif recordType == OPERATE_RECORD_ID_CARD then
            BuffDataM.set("id_card_record", 1, 1);
        end
    end

    EventMgr.fire(event.PHONE_ID_BIND_RESULT, { ["recordType"] = recordType, ["result"] = result});
end

-- 检查身份证是否合法
function checkIdCard(idStr)
    -- 过滤下空格
    local numStr = string.trim(idStr);

    -- 验证规则
    if string.len(numStr) ~= ID_CARD_LEN then
        return false;
    end

    local beginIndex, endIndex = string.find(numStr, "%d+");

    -- 第1位到第17都是数字
    if not (beginIndex == 1 and (endIndex == ID_CARD_LEN - 1 or endIndex == ID_CARD_LEN)) then
        return false;
    end

    -- 计算下前17位和最后一位校验位是否相符
    -- 前17位的系数7－9－10－5－8－4－2－1－6－3－7－9－10－5－8－4－2
    -- 最后一位对应校验1－0－X－9－8－7－6－5－4－3－2

    local coefTable = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    local sum = 0;
    for i = 1, 17 do
        local identityNum = tonumber(string.sub(numStr, i, i));
        sum = sum + coefTable[i] * identityNum;
    end

    local verifyTable = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};

    local verifyNum = string.sub(numStr, 18, 18);

    -- 最后一位如果为X大小写都可以，如果为"x"的转成大写判断
    if "x" == verifyNum then
        verifyNum = string.upper(verifyNum);
    end

    local verifyIndex = sum % 11 + 1;

    if verifyTable[verifyIndex] ~= verifyNum then
        return false;
    end

    return true;
end

-- 检查当前是否显示领取奖励
function canShowPhoneRecord()
    if PUBLISH_PLATFORM ~= PUBLISH_TYPE_LT then
        return false;
    end

    -- 功能未开启不显示
    if phone_is_open == 0 then
        return false;
    end

    -- 已经记录不能显示
    if BuffDataM.query("phone_number_record", 1) == 1 then
        return false;
    end

    return true;
end

-- 检查身份证记录是否显示
function canShowIdCardRecord()
    -- 该版本不显示
    if idcard_is_open == 0 then
        return false;
    end

    -- 已经在游戏中记录过了就不在显示
    if BuffDataM.query("id_card_record", 1) == 1 then
        return false;
    end

    return true;
end

-- 记录下服务端发下的验证码
function setPhoneAuthCode(authCodeInfo)
    ME.user.dbase:setTemp("auth_code_info", authCodeInfo);
end

-- 返回验证提示
function tipReturn(retType, tipMsg)
    if retType == VERIFY_RET_GS then
        doAlert(getLocStr(tipMsg));
    elseif retType == VERIFY_RET_LEITING then
        -- local desc = string.explode(tipMsg, "|");
        -- doAlert(desc[2]);
    end
end

-- 设置
function setIdCardOpen(isOpen)
    idcard_is_open = isOpen;
end

-- 设置当前请求信息
function setRequestInfo(phoneStr)
    local requestInfo = {
        ["request_authcode_time"] = TimeM.getCurrentTime(),  -- 请求时间
        ["phone_number"]            = phoneStr                -- 手机号码
    }

    ME.user.dbase:setTemp("phone_record_request_info", requestInfo);
end

-- 删除请求信息
function deleteRequestInfo()
    ME.user.dbase:deleteTemp("phone_record_request_info");
end

-- 查询请求信息
function queryRequestInfo(path)
    local requestInfo = ME.user.dbase:queryTemp("phone_record_request_info") or {};

    return requestInfo[path];
end

-- 手机号记录功能开放
function setPhoneNumberFuncOpen(isOpen)
    phone_is_open = isOpen;
end